There are many, many exceptions in the .NET framework. The base type of all exceptions is the System.Exception class.
There are a couple rules you want to follow when throwing exceptions. First, avoid throwing the System.Exception or System.SystemException base types. When you go to catch an exception, the base exception types tell you nothing about the exception type. Second, throw the most specific exception type possible. Again, this helps when you go to catch an exception to know what type of exception has been thrown, and makes the application much easier to maintain and debug. It is also preferred to throw existing framework exceptions rather than rolling your own if possible. Lastly, make sure that your exception parameters are simple and easy to understand. We all know how hard it can be to debug cryptic error messages, so make sure that yours aren't. For example, if you are throwing an exception inside of a catch block, make sure to set the InnerException parameter to the caught exception.
Sometimes it is a little daunting to figure out what exception to throw, and even know all the exception types that are available. To help me, and hopefully you in the future, following is a hierarchical list of most of the types that derive from System.Exception, linked to their respective MSDN article. I generated this list based on version 2.0 of the framework, and tried to include all the major .NET framework assemblies.
References:
http://msdn2.microsoft.com/en-us/library/seyhszts(vs.71).aspx
http://msdn2.microsoft.com/en-us/library/5b2yeyab(VS.71).aspx