I know how for curves, never tried for surfaces - it’s probably similar. - as @TomTom mentioned, fitting algorithms make most sense.
it is weird though, getting placed on the XY plane
It isn’t weird, makes sense. You have 3 numbers, a point is 3 numbers. The numbers are meant for uv but you plug them to point. The point just literally interprets those numbers as a point, even though they are not meant to be a point, but the point container doesn’t know that because the format of the data is the same as format of values it needs to make a point.
Edit: Here is what you need.
http://developer.rhino3d.com/api/RhinoCommon/html/P_Rhino_Geometry_NurbsSurface_KnotsU.htm
http://developer.rhino3d.com/api/RhinoCommon/html/P_Rhino_Geometry_NurbsSurface_KnotsV.htm
NurbsSurface nurbSrf = S.ToNurbsSurface();
nurbSrf.KnotsU.InsertKnot(uParam);
nurbSrf.KnotsV.InsertKnot(vParam);