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
[7, 6, [3, 3, 4, 4, 5, 6, 2]]
....... ....... ....... ....... ...OO.. ..XXXXO