I don't think most miners would accept double spend transactions but for the sake of simplicity, we shall assume that they will.
Shouldn't we always assume that they are only acting selfishly?
For starters, for this to work, miners will have to have a private chain within themselves. They have to mine and broadcast the blocks to each other before they can broadcast it to the network. Them broadcasting it to the network will result in nodes rejecting the new blocks since there is a longer chain with longer proof of work. Hence, you need the miners (at least 51% of them) to cooperate with you before the attack starts.
I think miners are already well connected. They can broadcast arbitrary blocks to each other for the others to decide how to react. These blocks are not invalid, they are orphans that arrive few blocks late. There is a possible future where they are part of the longest valid chain. And if there is an orphan that promises higher expected reward than the current chain, we should expect miners to mine on top of it. There is no coordination necessary. Sure, their current software might not be able to identify the expected additional reward. Or it is set up to ignore it. But it might as well accept the bribe.
Once they overtake the other chain, they broadcast their chain. By this time, majority of the community would have already realised that there is a successful 51% attack. Media outlets starts shouting and the price starts tanking. Next thing they know, their ASICs are completely worthless, together with their future income.
Its arguable that they can spend their 100BTC per block of additional fees and expect good profits but honestly, once they broadcast their chain, they have very very little time before the price crashes down.
Miners can minimize the effect on everybody else by inserting all other transactions at the same block height. No other transaction would be lost or even changed. The victim might be someone not well known (unknown?) or with bad reputation. After all, no rule was broken. The blockchain is valid. Code is law. The victim made the error of accepting a transaction as final, before it was safe to do so. Everybody must decide for himself when to accept a transaction as final. No one will come for rescue.
My point is, that the current behavior of accepting a (large) transaction as final after 6 (or any fixed number) of blocks is flawed, because it allows this type of attack. It is not a weakness in the protocol, but in the behavior of its users.