I already know how to write games in C#, and I've learned the concepts behind network game programming, and created a working multiplayer game that works over LAN.
As an example, somebody runs the game server, which keeps track of the position of... say, a ball. Every so often, the server sends the current location and velocity of the ball to each of the connected clients. If something goes prevents the server from sending the stuff to the clients, the clients can still calculate the position of the ball by using the velocity, and hopefully stay closely enough synchronized with the server until it can resume sending again.
This is all very well and easy over LAN... but how do the clients connect to the server over the internet?