Too many times we programmers view programming as if it is a transfer of bits over a wire somewhere. You shove a pizza under the door, email some requirements, and out pops a solution.
It doesn't work that way at all. Most of the really cool things that happen with teams can't be predicted ahead of time. You just put some really smart people together in a room, throw a tough problem at them, get out of the way, and watch the magic happen.
The magic doesn't happen when nobody has met each other and communication is limited to telephone, email, and IM. I'd rather have 5 guys who weren't so smart all working together in an awesome team than 10 guys who were rocket scientists all plugged in remotely.
Having said that, there are ways to get where everybody wants to go. Hire locally and then let folks work remotely from time to time. Hire people who have already worked closely together and have developed a great relationship. Hire in clusters, etc.
I like 37Signals, but too many times much of their blogging and communication consists of "look how awesome we are!" I am all for people self-promoting, but this schtick starts to become annoying to me after a while. It sounds a bit like pandering and easy sophistry. Things are not that simple. We would not all be awesome if we worked like 37Signals and things would not be better if we all suddenly switched to remote workers overnight.