That would actually be,
["O", "O", "O", "O", "O"]
It likely has to do with assignment. If we write,
a = ['O'], ['O'], ['O'], ['O'], ['O']
it will create a tuple of lists.
print a # (['O'], ['O'], ['O'], ['O'], ['O'])
It could be made to work, though. But it's not what is expected here.
From a standpoint of program logic, the behavior exhibited is something we might expect from Python. A list of identical elements.
board = 
for k in range(5):
board[k] = ["O"] * 5
for k in range(len(board)):
print " ".join(board[k])
If we attempt to create a tuple, we end up with a string.
y = ("O") * 5
print y # OOOOO
If we manually create the tuple,
a = ('O','O','O','O','O')
print " ".join(a) # O O O O O
that would mean our program could not dynamically create any size of board. It would take some thought.