# Python 2, 143 Bytes

<!-- language-all: lang-py -->

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][1] or [view all test cases][2].


  [1]: https://repl.it/DnAQ/6
  [2]: https://repl.it/DnAQ/11