Please split question in different posts. It's easier to track.
(1) use the BidirectionalUndirectedGraph to turn your undirected graph into a directed graph.
(2) you can use a closure to encapsulate the target node in the delegate:
TVertex target = ...
Func<TVertex, double> cost = (v, d) => d + GetDistance(d, target);
(3) that's correct. I should probably add a way to shortcut the search.