For what it's worth, I also like the simple solution. In addition, it is easy to use the same paint function for both the surface and the dots:
g = Plot3D[Sin[x + y^2], {x, -3, 3}, {y, -2, 2}, Mesh -> {1, 4}, Boxed -> False, ColorFunction -> "Rainbow"]; p = ListPointPlot3D[Table[{x, y, Sin[x + y^2]}, {x, -3, 3, (3 - (-3))/(1 + 1)}, {y, -2, 2, (2 - (-2))/(4 + 1)}], ColorFunction -> "Rainbow", PlotStyle -> PointSize[Large]]; Show[g, p]

Edit: If we want to do this in custom myPlot3D, I think the following:
myPlot3D[f_, {x_, xmin_, xmax_}, {y_, ymin_, ymax_}, Mesh -> {i_Integer, j_Integer}, opts : OptionsPattern[]] := Module[{g = Plot3D[f, {x, xmin, xmax}, {y, ymin, ymax}, Mesh -> {i, j}, Evaluate@FilterRules[{opts}, Options[Plot3D]]], stx = (xmax - xmin)/(i + 1), sty = (ymax - ymin)/(j + 1), pts}, pts = ListPointPlot3D[ Table[{x, y, f}, {x, xmin + stx, xmax - stx, stx}, {y, ymin + sty, ymax - sty, sty}], Evaluate@FilterRules[{opts}, Options[ListPointPlot3D]]]; Show[g, pts]];
Note that the parameters apply to both charts, but are filtered first. I also deleted the points on the plot outline. For example,
myPlot3D[Sin[x + y^2], {x, -3, 3}, {y, -2, 2}, Mesh -> {4, 10}, Boxed -> False, ColorFunction -> "Rainbow", Axes -> False, PlotStyle -> PointSize[Large]]
will result in
