The most general solution is to do the whole layout yourself.
You can actually use Control
and put the controls themselves in the Grid
along with your output.
So you will have only ONE grid, which now includes everything in it. Both the controls and the final output of your Manipulate code. This gives you full control of what you want to do. For your example, you can then do
Manipulate[
Grid[{
{Grid[{
{"x", Control[{x, 10, 100, 1}]},
{"y", Control[{y, 10, 100, 1}]}
}]
,
Plot3D[Sin[x + y^2], {x, -3, 3}, {y, -2, 2}]
}
}, Frame -> All, FrameStyle -> Gray]
,
Paneled -> False]

And if you want just a line between the controls and the plot then
Manipulate[
Grid[{
{Grid[{
{"x", Control[{x, 10, 100, 1}]},
{"y", Control[{y, 10, 100, 1}]}
}]
,
Item[Plot3D[Sin[x + y^2], {x, -3, 3}, {y, -2, 2}],
Frame -> {{True, False}, {False, False}}]}
}]
,
Paneled -> False]

But now since you have everything inside a Grid, you can play with the layout as you want. For example, you can do this
Manipulate[
Grid[{
{Grid[{
{"x", Control[{x, 10, 100, 1}]},
{"y", Control[{y, 10, 100, 1}]}
}]
},
{
Plot3D[Sin[x + y^2], {x, -3, 3}, {y, -2, 2}]
}
}, Frame -> All, FrameStyle -> {Dashed, Red}, Spacings -> {1, 1}]
,
Paneled -> False]

Or you can put one control above, and one below
Manipulate[
Grid[{
{"x", Control[{x, 10, 100, 1}]},
{Item[Plot3D[Sin[x + y^2], {x, -3, 3}, {y, -2, 2}], Frame -> All],
SpanFromLeft},
{"y", Control[{y, 10, 100, 1}]}
}, Frame -> True, FrameStyle -> Gray, Spacings -> {1, 1}
]
,
Paneled -> False]

And so on. The choices are limitless.
You can change the style of the Frame
and change the size of the controls as well. Basically you can now use all the styling available for Grid
and Frame
as you want and not worry about Manipulate
itself.