Python, 285 bytes
b,p,q,r=["."]*9,"1","2",range
while"."in b:
w=[b[i*3:i*3+3]for i in r(3)]+[b[i::3]for i in r(3)]+[b[::4],b[2:8:2]]
for i in w[:3]:print i
if["o"]*3 in w or["x"]*3 in w:exit(q)
while 1:
m=map(lambda x:x%3-x+x%3+7,r(9)).index(input())
if"."==b[m]:b[m]=".xo"[int(p)];p,q=q,p;break
...Oh, this wasn't what you meant when you said "Code Golf: Tic Tac Toe"? ;) (enter numpad numbers to place x's or o's, i.e. 7 is north-west)
Long Version
board = ["."]*9 # the board
currentname = "1" # the current player
othername = "2" # the other player
numpad_dict = {7:0, 8:1, 9:2, # the lambda function really does this!
4:3, 5:4, 6:5,
1:6, 2:7, 3:8}
while "." in board:
# Create an array of possible wins: horizontal, vertical, diagonal
wins = [board[i*3:i*3+3] for i in range(3)] + \ # horizontal
[board[i::3] for i in range(3)] + \ # vertical
[board[::4], board[2:8:2]] # diagonal
for i in wins[:3]: # wins contains the horizontals first,
print i # so we use it to print the current board
if ["o"]*3 in wins or ["x"]*3 in wins: # somebody won!
exit(othername) # print the name of the winner
# (we changed player), and exit
while True: # wait for the player to make a valid move
position = numpad_dict[input()]
if board[position] == ".": # still empty -> change board
if currentname == "1":
board[position] = "x"
else:
board[position] = "o"
currentname, othername = othername, currentname # swap values