WaitCommEvent seems to never set the event flags to RXCHAR but NONE, and thus no data will be read/handled even if GPS data arrives to the COM port. This is an incompatibility problem with .NET CF and HTC P3300.
So what if we ignore the flag checking and read whatever it comes available? Inside Port.cs, function CommEventThread(), commenting off the following line will actually make GPS respond with valid data:
// check for RXCHAR
//if((eventFlags & CommEventFlags.RXCHAR) != 0)
Another thing, if this one line is not commented off, then in Open() function of Port.cs, the priority of eventThread must be set to lower than BelowNormal (including), or the program hangs, device's connection to PC breaks, and the device has to be rebooted. It can also make AcitveSync blind... With this line commented off, the rest code can stay intact.
Hope this will spare a couple of hours for someone who's having the same problem as I did.
Bonnie