While this is not so much of a mathematical solution as a software one, I'm going to add it anyway, if only for the nice image at the end.
The process used to find all of the grids is as follows.
First of all each of the squares on the 3x3 grid is assigned a index 1 to 9 based on the coordinate ($n=3(y-1)+x$), where $(1,1)$ is top-left and $(3,3)$ is bottom-right. This number represents the highest index of a panel which can cover it.
Essentially this means that panels must grow out from any square rightward and downward. This limitation prevents duplicate entries - every panel which grows right-down is identical to one which grows left-up.
The task is then to simply build up a list of possible grids by adding panels. The panels are using a recursive approach which abandons all grids which could only be covered have more than one panel with the same index thus preventing duplicates grids.
For anyone interesting is seeing the MATLAB code which enumerated all the grids, I've including it at the end of the answer.
It's quite impressive how fast the number of possible grids grow.
For a 3x3 grid we have the 322 possibilities as was identified by the other answers. Jumping up to 4x4 gives 70878 possible grids. Going for a two page spread of 3x6 the number increases to a barmy 314662 possible grids!
Having built all possible grids, it only makes sense to export them into something pretty. Below is all of the grids tiled and converted to a combined image of all 322 possible grids. In the image the colour of a panel represents the index of top left square in that panel.

The grids are sorted in the order that they were found - which is essentially one of starting with a solid square and then working back from the bottom right corner.
The following MATLAB functions are used to produce the grids.
function [found] = makeGrids(found,grid,depth,x,y)
if (depth > (x*y))
%If at max depth then grid is valid.
found = [found grid]; %So add to list
disp(grid)
%found=found+1; %So one more found
else
%Show current depth and found count during search.
if (depth<=(x*(y-1)))
disp([repmat('..> ',1,depth) num2str(depth) ' (found:' num2str(numel(found)) ')']);
end
%Another layer to do
for k=1:depth
%For each number in this layer
grid(depth)=k; %Update grid with new number. Depth is linear index
%Now we check to see if the current state of the grid is
%acceptable (if it isn't then no lower down ones possibly can)
if (checkPanels(grid,depth,x,y)) %If it is acceptable (i.e. there are no remaining values with no frame)
found=makeGrids(found,grid,depth+1,x,y); %Work through the next layer
end
end
end
end
function success = checkPanels(grid,depth,x,y)
success = false;
for ys=1:y
for xs=1:x
%Start at (1,1) and work through to (n,n)
expected = xs+(ys-1)*x; %Linear index of this cell
if(expected > depth)
%If the expected val is more than current depth
return; %Then we are done searching
end
panelFound=false;
for xe=x:-1:xs
for ye=y:-1:ys
%For each end value starting from largest to smallest
panel=grid(xs:xe,ys:ye); %Extract the current panel
panel(panel==expected)=0; %Cover all instances of expected value in panel
panelFound = all(all(~panel));%Check if every number in this panel is covered
if (panelFound) %If we have found a complete panel
grid(xs:xe,ys:ye) = -1; %then mark panel a covered in the grid.
break; %We can only have one panel for any given number, so break.
end
end
if (panelFound)
break; %We can only have one panel for any given number, so continue break.
end
end
%Check if entire grid is covered
if (all(all(grid==-1)))
success = true; %Grid is all covered and valid
return;
end
end
end
end
The following script is then used to call the function and create the tiled image (although I added the borders with edge detection in Photoshop)
%Grid Size
x=3; %3x3
y=3;
%Enumerate all grids
grids=makeGrids({},zeros(x,y),1,x,y);
gridCount = numel(grids);
disp(['Grids Found: ' num2str(gridCount)]);
%Colour mapping for image - hot(x*y), hsv(x*y) and jet(x*y) all look good
map=[jet(x*y);0,0,0]; %;0,0,0 is for black borderd
%Create images for all grids
nameFormat = ['%0' num2str(ceil(log10(gridCount))) 'd'];
for i=1:gridCount
img=grids{i};
img(x+1,:)=(x*y)+1;
img(:,y+1)=(x*y)+1;
[img, newmap]=imresize(img,map,32,'nearest');
imwrite(ind2rgb(img,newmap),['Grid' num2str(i,nameFormat) '.png']);
end
%Create tiled montage of images
dirOutput = dir('Grid*.png');
fileNames = {dirOutput.name}';
vertical = max(factor(gridCount));
horizontal = gridCount/vertical;
montage(fileNames, 'Size', [vertical horizontal]);
%And save montage as PNG.
allGrids=getframe(gca);
imwrite(allGrids.cdata,'AllGrids.png');