How effective are cacheing plugins for dynamic pages?

Caching full pages is not going to do you any good for a situation like you described. Users will update things and expect to see their updates right away — meaning you spend more server time invalidating cached pages. The database server is likely to be your biggest bottleneck in just about any webapp.

Two things you can do:

  1. Move your Database to a separate server — ideally this server probably has a ton of memory and it’s only job is to serve the database.
  2. Use a more permanent object cached like memcached or APC. WordPress has an object cache baked into the core, but it’s lifetime is only a single page load. The two linked object cache backends are “drop ins” that replace that cache with memcached. Any time wp_cache_get is called, memcached/APC will be get hit first before a call is made to the database.