How can I automate sharding in the presence of continuous reads
Some thoughts on each of the options:


I would say that writing this code in any case is probably a good idea - if something does go wrong on the performance side of things you already have the code written to deal with it in some way, rather than just sending exceptions or timeout messages back to the users. 
This sounds like pre-splitting and pre-allocation, which again, is probably a good idea to do anyway - why wait until just before use to create a database?  In fact, this would mirror how mongodb does data file allocation, it always has one empty data file waiting to be filled before it is needed.  The pre-allocation it does is for adding data to a DB though, it can't psychically figure out the need for a new DB, hence that initial allocation may be slowing you down.  Also, make sure you are on ext4/XFS and not using an old kernel to ensure that the allocation is as quick as possible.
I believe that doing pre-allocation is a better option here - I have not heard of anyone using copyDatabase in this manner, so it would require a lot of testing.  Pre-allocating databases in advance though is quite common.
This does sound a bit painful, I think there are better options described above


Overall, if you know you are going to need a new database every hour, create multiple databases in advance of their need.  I know this would mean extra disk usage, but it should be quite predictable (look into the --smallfiles option if your data set is quite small).