143 131 Bytes
This doesn't use any real fancy tricks,
except list transposition to make index access easier since we can print the board transposed. 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 g) # build the board
[7, 6, [3, 3, 4, 4, 5, 6, 2]]
....... ....... ....... ....... ...OO.. ..XXXXO