Students who have trouble imagining often need to see it with their own eyes in order to imagine. So a model is often the best approach to support their imagination, and it's not too infeasible.
You can buy commercial playdough, or make your own if you want a really big blob. (Recipe below)
I like to draw an x and y axis on a piece of paper, and then put the playdough on top in some sort of shape. To mark points on the surface, you can poke a tiny hole with a sharp pencil. A sharp pencil can also be used to scratch lines in the surface to make level curves.
If you pick a line and slice it with a knife, you can show the exposed face and note that it makes an ordinary curve, which has slopes of its own. Marking an axis on the paper along the knife-cut helps to point out that direcitonal derivatives require a new axis with points marked by a unit vector.
Slicing parallel to the x-axis or y-axis helps you point out the meaning of the ordinary partial derivatives.
If you are in a lecture theatre with a document camera, you can very successfully do this on the document camera -- just remember to lift and tilt it every so often so they can see the three-dimensional nature of it. If you have tutorials with a smallish number of students, you can get them to stand around one table.
PLAYDOUGH RECIPE (from McKenzie's Cream of Tartar box):
2 cups plain flour, 1 cup cooking salt, 4 tbsp cream of tartar powder, 2 tbsp cooking oil, 2 cups water, food colouring
1. mix the dry ingredients in a saucepan.
2. add the wet ingredients including the colour and mix well.
3. cook over medium heat stirring continuously until the mixture congeals.
4. tip out and allow to cool.
5. knead until smooth.
6. store in a plastic bag in an airtight container.
Using a sand-box
I haven't tried it myself yet, but I think a clear container with slightly wet sand could do a similar job to playdough, though it is messier.
Cardboard for tangent planes
When talking about tangent planes, students often have real trouble imagining them. You need to have a proper model of the plane. Paper is too floppy and so doesn't work. You need something thicker. Any cardboard should do. You can draw vectors on the plane to represent the x-slope and the y-slope. A playing card would be a good thing to use -- you could even use pins to attach several of them to the playdough at the points they are tangent to.
Water levels for level curves
If you can get your hands on a big clear container and a heavy object, then you can explain level curves using water. Put the object into the container and start pouring water slowly. The edge of the water describes a level curve on the surface. I reckon it would be even more striking with coloured water, especially if the object was a very different colour, though I haven't tried this.
Potato printing for level curves
Take a potato (or other vegetable/object) and cut it. Dip the end in paint and press it down on a piece of paper. The shape left is the shape of the level curve. Slicing it again at another height and redoing it can show how the curve changes as you move up the potato. Changing colours as you go can highlight a sequence of level curves.
Slightly less geometric models
The temperature or smell analogy
Instead of trying to visualise the function, you can appeal to the students' other senses. I often use the analogy that at each point in a room, there is a temperature -- each point "feels" hot or cold. A gradient in a particular direction is how quickly the temperature changes when moving that direction. For example, the temperature will increase when you move towards the heater.
Another alternative is smell. You can imagine a smell being stronger in one place in a room than in another.
A visual version in 2D is to use colour -- possibly red-to-blue gradients to match with the temperature.
These three reinforce the idea that the function doesn't have to represent a height, and that you can think of it like the function value "lives" at each point -- if you inspect the point itself you can make it reveal its function value.
Colour-coded level curves
One way of thinking about a function is that at each point there is a value right there for the function. If you colour in all the points with the same function value, you will make curves. If you use a gradient of colour for changing values (say blue-to-red), students can see the speed at which colour is changing.
If you space your curves evenly by function-value, then you can pick any point and any direction and draw a line, noticing how far you have to travel to get to the next function value. This is a representation of the rate of change. When lines are close together you pass by a lot of them very quickly so the function value is changing quickly.
It is important to colour the lines so that you can tell whether it's going up or down.
One way to think of functions is as input-output machines. A two-variable function takes a point in 2D as input and produces a number as an output -- which can be interpreted as a line. So you can actually draw two separate pictures -- a plane for the input and a line for the output.
You can mark points in the plane, and then mark the matching points on the line. Colour-coding can help to identify which point produces which output. If you move an input point along a line, you can investigate how quickly the output point moves.
Geogebra should allow you to do this by having two graphics windows open at once. Make a point A in one window. In the second window turn of the x-axis and make a point B = (0, x(A) + y(A)^2) [or whatever function]. Then try moving the point A and see what happens to the point B. See a quickly-made example here