Если отсортировать все точки пересечения по направлению обрезаемой полилинии, то получается все правильно:
Можешь попробовать отсортировать так...вроде покороче, может даже работает)))
var sortPoints = points.OfType<Point3d>().OrderBy( n => pline.GetDistAtPoint( n ) ).ToArray();
Point3dCollection sortPointsCollections = new Point3dCollection( sortPoints );
Да и вообще вместо Curve.GetSplitCurves(Point3dCollection) лучше использовать Curve.GetSplitCurves(DoubleCollection)
..делал очень давно, так что извиняюсь если что неточно.
...кажется что-то припоминаю, что у меня были иногда проблемы, когда применял Curve.GetSplitCurves(Point3dCollection). Метод Curve.GetSplitCurves(DoubleCollection) работал надежнее. То ли с округлением координат, дело было, чуток не попадали на разрезаемую кривую, и подтягивал их GetClosestPointTo. Или Curve с самопересечением. Может и сам тогда где-то накосячил.