For the last few years, I've had a hobby project of building my own Dominion client, so I can speak from experience about what cards are hardest to implement.
1. Possession -- in a league of its own. So many rules around this and it necessitates sending all kinds of different information between the players that isn't required for any other card.
2. Extra turns and stuff that happens in between turns -- the rules here are rather complicated again.
3. Band of Misfits/Overlord/Inheritance -- there are an awful lot of ways that cards can interact with one another, and BoM/whatever needs to make sure it correctly captures all those different interactions.
4. Cards that require their own UI element -- programming the cards is actually super easy most of the time. What's much trickier is displaying everything correctly. So cards that have a UI element that is unique, e.g. Embargo, Tax, Necromancer, Druid, etc. tend to get bumped down the list, since the UI work isn't shared with any other card. Little payoff for the work that it takes.
For the most part, it's not individual cards that are difficult, but implementing certain rules, such as Lose Track or cards that set up effects that happen later, such as Scheme, Merchant, or Durations. For example, Ghost took quite a bit of time to get correct, since it's both a Duration and a Throne Room variant (which could be doubling a different Duration), but that was really about nailing down the correct behavior for both Duration effects and for when Throne variants stay in play.