Finding corners from Line arrays
You have similar code and similar performance issue in your other question about points instead of lines.  I answered that one here. Some of my answers can apply here particularly as to the repeated use of .ToArray()?

If you skipped everything as arrays and went with IEnumerable&lt;Line&gt; or IEnumerable&lt;Point&gt; for inputs, output, and anything inbetween then you might see some performance benefit.  Might.  Don't know until you run it.  But sounds like you are talking about big collections.

If you try using IEnumerable and things are still slow, I'd try to use Parallel.For with a range partitioner.

That should address your major concern.  On a minor concern, the Line class is good enough and looks like something I once wrote.  I eventually switched from StartPoint and EndPoint to Point1 and Point2 since some readers may think StartPoint should somehow be 'less than' when compared to EndPoint or that it should be drawn like a vector that somehow starts at StartPoint and is then drawn to EndPoint.  To avoid such needless notions, I went with the generic Point1 and Point2.