I'm not sure this is the fastest way, but it seems to work.
The whole idea is to connect the points using line segments that do not intersect (except at the points, and this is a little trickier to define than you might think). So start with the original unsorted list, connect them in order -- forming a closed path that may have many crossings -- and then eliminate the crossings one by one, by means of reversing subsequences of points in the list.
Suppose we start with [a b c d e f g h], and discover that the b-c edge crosses the g-h edge. We reverse the c-g sequence to get a new list: [a b g f e d c h]. Two edges have been removed and two new ones created; the rest are undisturbed (although some have had their directions reversed).
I have not been able to find a case in which this process would run forever (that is, the list would return to a previous state), nor a proof that this cannot happen.