I found 2 more bugs:
In IsPathClosed I had the Exit for in the wrong place so that it returned false every time.
In FindAndDrawPath I had BinaryHeapRemove called too late in the function so that the current cornet was at risk of not being removed and added to the closed list.
I've attached what I have so far, but it still has an infinite loop somewhere.......