So if you change conditional defines, you must do a rebuild, not just a recompile. Since the Delphi compiler is very fast, this fortunately does not make much of a difference for compile times.
Form X and FormY has the same name in Delphi - Let's say MyForm. In other words, If I have a button on the main form of the project, I want to say MyForm.DoSomething on the button's onclick event. Depending on what conditional directive I specify, I want either formX.DoSomething, or FormY.DoSomething to be executed. Trying to make Delphi more C#-like is a mistake. Just think how the attributes syntax in modern Delphi is not pascal-oriented: it should be defined after the type definition, as in the free pascal syntax, not before it, as in C#/Java.