The Stack Overflow podcast is back! Listen to an interview with our new CEO.
2 of 5 added 114 characters in body

Python 2, 143 Bytes

This doesn't use any real fancy tricks, except list transposition to make index access easier. Definitely not done with this just yet. Moves are taken as 0-based numbers. Byte count comes before commenting.

i,j,k=input()                                     # split up the input
t=0                                               # keep track of whose move it is
g=[j*['.']for _ in range(i)]                      # board init
for b in k:g[b][g[b].index('.')]='XO'[t%2];t+=1   # read moves sequentially, place pieces
print'\n'.join(''.join(m)for m in zip(*g)[::-1])  # build the board

Example Input: [7, 6, [3, 3, 4, 4, 5, 6, 2]]

Example Output:

.......
.......
.......
.......
...OO..
..XXXXO

Try it online or view all test cases.