Есть ли причина, по которой вы не можете сделать это:
void functionX()
{
functionY();
// ... etc
}
На основании описания в вопросе это правильный ответ. Я полагаю, что вы уже рассмотрели это.
Другая возможность - использовать систему событий в ваших интересах, что-то вроде (некомпилированное):
event Action FunctionXCalled;
// somewhere in initialization...
MyCtor()
{
FunctionXCalled += functionY;
}
void functionY() { }
void functionX()
{
if(FunctionXCalled != null) FunctionXCalled();
// ... etc
}