Yeah... it's a consequence of the original design, which did not take card updates into account. So when one does happen, we just replace the properties/code/image of the card and hope for the best. You can also notice that when viewing old replays, sometimes the game state after playing a card does not agree with what the played card said should happen - that is one of the consequences.
I did sit down and think a few times about how card versioning would be done, but couldn't think of a way that wouldn't be a performance disaster or a maintenance nightmare.
Probably the easiest way to do it would be: everytime a change to a card needs to be done, first create a duplicate of the old card (and card image) and give it a new ID. Then replace the card in all decks (players, AI presets, default starter decks) and mark it as unavailable in deck editor. This would turn cards.xml into an append-only container, and would do the job, but sounds really disturbing to me, compared to the inaccurate but simple thing we use now.