Edit - xenon481 has explained more above that I skipped, I'll check back in when a little more sober
Client version is static indeed. I don't expect to see people turn off their miner, updating their bitcoind or custom miner, and starting to mine, repeating this action several times a minute.
I'm not sure I understand the question properly. If you are saying that transactions and such are added added after the block header is hashed, then you are mistaken.
The header is built first, then hashed. To build the header you need:
1) current version
2) the hash from the previous block (same for every one)
3) the merkle root. It is a 256 bit hash of the transaction list (including the coinbased transaction) that you are adding to the block. As such, you need to pick the transactions you want to integrate before you can attempt to solve the block
4) time stamp. I haven't looked at that part of the code so don't quote me on this but I read somewhere that this one is updated every few seconds or so by bitcoind. If you are using a custom miner, you may very well not update that part quite as often. Although there is no guarantee a given block header has a solution for the outstanding difficulty, and I don't think you can keep on adding extra nonces, so eventually, you'd have to update the timestamp to get a new header, knowing that a 5870 can perform the 2^32 possible nonce's for a given header in about 10 secondes.
5) the current target. Extracted from difficulty, that is static across the network too.
6) the nonce, a random 32bit integer value that you keep incrementing until you reach 2^32 possibilities. You can randomize work with the nonce as well, by feeding your workers different starting nonce.
The coinbase address is more of a way to differentiate you on the network rather than on the mining side. The avalanche effect makes sure that even a single bit of difference in your header will result in completely different hashes. I hope this is the answer you were looking for.