I almost just PMed you my question expecting you would know the answer but made the tread lol:)
Then I guess what I should have asked is, does the pool only send out one header to one miner?
Yes. Otherwise it would have two miners doing the same work (cutting effective hashrate of the pool in half). If a pool is consistently "unlucky" over a long period of time it may be caused by a bug which is sending duplicate work to multiple miners.
Also could two different pools send out the same header to two different miners? Odds would be low I'm sure but could it happen?
Effectively no. One element of the block header is the merkle tree root and the merkle tree cointains the coinbase which contains the pool's reward address. Thus two different pools will always have a different merkle tree root and different headers.
I say effectively because technically two different sets of data could generate the same hash (a hash collision) but the odds are 1 in 2^256 and can be effectively considered 0.
The entire block header consists of:
"Bits" (current target)
Nonce 32-bit number
So the pool sends all that data except nonce to the miner who increments and hashes each nonce looking for shares. N-time-rolling allows the miner to increment the timestamp locally. This allows multiple nonce ranges (0 to 2^32) to be attempted on each get work. Technically the pool only needs to update the miner when one of the other elements change.
target, and version will never change intra block.
Previous hash only changes when a block is found.
The merkle root only changes when a transaction is added.