You can load cursors from file dynamically like this:
var myCursor = new Cursor("myCursor.cur");
After you have loaded it, you can set the cursor of any control like this:
myControl.Cursor = myCursor;
The cursor also accepts a stream as a constructor parameter. This means that you can load from a resource embedded in your application, rather than from the file system.
Windows will not let you have more than one cursor, but you can draw more than one on your control. You can use the cursor object's Draw
method like so:
myCursor.Draw(g, new Rectangle(...));
If you are using TCP/IP to send the cursor data between clients, then this should be enough to work.
However, there have been a few applications that have supported multiple input on a single PC. (For example, Rag Doll Kung Fu) For this, you are looking at something that the .NET framework doesn't support.
You will probably have to look into PInvoking some USB calls. (I don't have much experience here, so I can't ellaborate.)