It is worth breaking this down.
the 'move from 2.0 to 3.5' is in fact several things (some optional some not)
- The version of the BCL libraries goes from 2.0 to 3.5
- This actually is largely an addition of some more libraries like those responsible for LINQ. The libraries from 2.0 you are familar with have only had (minor) bug fixes.
- Compiler changes
- The move from c# 2.0 to c# 3.0
- Lamda expressions
- var type inference
- much improved designer support via partial classes
- LINQ (to objects, to xml, to sql
- anonymous types
- automatic properties
- Extension Methods
- and more...
- The move from VB.Net 8.0 to VB.Net 9.0
- much the same as c# in regards to lamdas/LINQ/var
- XML literals
- VS 2008 instead of 2005
- Improved intellisense (faster, more tolerant of failures in it without bringing down the entire app)
- unit testing integration in VS 2008 Professional rather than team system
- many more changes than I can list here
You will realistically need to move to VS 2008 to achieve the c# compiler upgrade.
You can upgrade the compiler but NOT move to 3.5 library, this means you lose out on certain aspects of Linq unless you use a plug in replacement like LinqBridge.
Each of these upgrades bring their own pros (and a few cons).
For your needs I would imagine access to the new MVC ASP.Net may prove useful. I have no personal experience with it but it appears to be widely viewed as a good framework for this sort of use.
The integrated test functionality means you can use this for free (I find being able to debug into my unit tests easily was worth the price of tools like TestDriven.Net so so getting (some) of this for free is useful.
The improved stability (and start up time) on VS 2008 has been very useful for me. I also find "Go To Definition" an incredibly useful command that speeds up my workflow a surprising amount.
I second those saying that the new LINQ related language enhancements are useful. I find the extension methods on IEnumerable<T>
make certain tasks that used to require many lines of boiler plate and needless variables take only one (very descriptive) line. This reduces the need to separate out functionality into more methods and enhances readability.