I've had to do this a few times and I'm not sure there's ever a single "best way to do it"
1) The webserver can be configured to respond for any domain. Then your application software can look at the HTTP host header to decide which client you are working with.
2) I've used DJBDNS in the past because it's very easy to generate the necessary config files and if I recall didn't require restart (since the config is stored in a "database file" - binary flat file in this case). You could also try dynamically rewriting the BIND config and restarting it via a cronjob every 10 minutes.
3) No clue here but it should be easy to automate
The worst part of all this is having to write the DNS docs for users so they can point their domain correctly. DNS is incredibly confusing to setup for "mere mortals" due to the many different registrars with varying DNS editing capabilities. Caching and IP address perplexity makes it worse.