It's actually easier to do this with a one dimensional array than it is with a 2D array (edit: I was wrong, the zip approach is pretty darn easy too, and the best IMO; leaving this for comparison), so just for fun, we'll convert to 1D, than rotate to a new 2D:
>>> from itertools import chain
>>> # Collapses to 1D
>>> grid1d = list(chain(*grid))
>>> # Rotates and rebuilds as 2D
>>> numcolumns = len(grid[0])
>>> rotated = [grid1d[i::numcolumns] for i in range(numcolumns)]
>>> print(*rotated, sep="\n")
['.', '.', '0', '0', '.', '0', '0', '.', '.']
['.', '0', '0', '0', '0', '0', '0', '0', '.']
['.', '0', '0', '0', '0', '0', '0', '0', '.']
['.', '.', '0', '0', '0', '0', '0', '.', '.']
['.', '.', '.', '0', '0', '0', '.', '.', '.']
['.', '.', '.', '.', '0', '.', '.', '.', '.']
Side-note: If you're on Python 2, that print syntax would require a from __future__ import print_function to work.