I got the code to work with the serial monitor from the arduino software which makes no since to me.Serial is an asynchronous communication method. So you can't expect characters to arrive within a given time frame.
The serial monitor is sending characters fast enough that the serial buffer gets both characters before you check it. In the case of the C# program, it must not be sending the characters fast enough so that your code executes, and only sees one character at a time.
There are two solutions:
1. Always send the same number of characters and only check what's in the serial buffer when that many characters are received. (E.g. Serial.Available() > 2). of course, you have to be careful and only read two characters at a time (what if there are 4?)
2. Use a delimiter like NL or CR to let your program know when a string is done being received. In that case you process the characters on at a time until the delimiter comes in.