1 of 5

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