The first thing that comes to our mind when we think about determining the call flow is to check the call stack. But checking stack frames can only give us the current call hierarchy and not the previous one. i.e Even if you check stackframes in C3, it wont have the history of A calling B. So this wont work.
This means that each called method also somehow needs to participate in achieving this goal. Each method has to somehow determine that the caller is wanting to track the flow and has to contribute towards providing the required information. But adding some code in each possible method that can be called is just ridiculous.
Another way of doing this is to delegate this to someone who can intercept each method invocation, check if caller is wanting to track the flow and log the required information which can be accessed later. This is exactly where i think Aspect Oriented Programming (AOP) comes into the picture. To use AOP in .Net please have a look at PostSharp. If i get time i will try and come up with some code sample but for now i can only point you to this url: http://www.postsharp.net
I hope this helps.