I had similar problems before. You can use folling MATLAB function to plot your grid. It's far from being perfect, but that's what I've figured out so far.
You probably hve to adjust it to your needs!!
NOTE: you need to habe the KML-Toolbox and the MAPPING-Toolbox installed.
function [ ok ] = grid2kmloverlay( grd, R, varargin )
% grid2kmloverlay takes a georeferenced grid and produces a KMZ file out of it
% INPUTS:
% grd: grid
% R: reference vector for the grid
%
%OPTINAL INPUTS:
% 'saveas', 'path/to/file'
% 'datasetname', 'nameOfDatasetAsShownInGE'
%
% 'clim', [min max]
% 'cmap', colormap (valid string or matrix);
% 'opacity', 0...1 (not working properly);
% 'debug', boolean (if set to 1 then show directly in GoogleEarth )
%% Set defaults
%color
cLim=[min(grd(:)) max(grd(:))];
cmap=jet(2048);
opacity=1;
% OutFile
saveflag=0;
OutFile=['C:\tmp\', 'grd_overlay.kml'];
DataSetName='test';
%
colorbarflag=1;
%show directly in GoogleEarth?
debug=0;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Parse Varargs
if (~isempty(varargin))
for c=1:2:length(varargin)
switch varargin{c}
case 'clim'
cLim=varargin{c+1};
case 'cmap'
cmap=varargin{c+1};
case 'opacity'
opacity=varargin{c+1};
case 'saveas'
OutFile=varargin{c+1};
saveflag=1;
case 'datasetname' % e.g. the date
DataSetName=varargin{c+1};
case 'debug'
debug=varargin{c+1};
case 'nocolorbar'
colorbarflag=0;
% (continued)
otherwise
error(['Invalid optional argument, ', ...
varargin{c}]);
end % switch
end % for
end % if
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% determine the limits of the grid, use setltln() for that
% We start with the upperLeft edge of the grid
row=1;
col=1;
[maxlat, minlon]=setltln(grd,R,row,col);
%then the bottomRight edge of the grid
row=size(grd,1);
col=size(grd,2);
[minlat, maxlon]=setltln(grd,R,row,col);
lonlim=[minlon maxlon];
latlim=[minlat maxlat];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Prepare the plot
%set NaN values to be transparent
alphamask=repmat(opacity,size(grd));
alphamask(isnan(grd))=0;
f1=figure;
h1=imagesc([min(lonlim),max(lonlim)]...
,[min(latlim),max(latlim)]...
,grd);
set(gca, 'YDir', 'normal');
colormap(cmap);
set(gca, 'CLim', cLim);
set(h1,'AlphaData', alphamask);
%% Make a KMZ/KML and run in GoogleEarth
k = kml(DataSetName); %create an kmltoolbox object
f = k.createFolder('image.overlay');
f.transfer(gca,'keepAxis',false...
,'transparentBG',true...
,'altitudeMode','clampToGround'...
,'altitude',1);
if saveflag
k.save(OutFile);
disp(['Saved KMZ to:', char(10), OutFile])
end
if debug
k.run
end
close(f1)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% EXPERIMENTAL make Colorbar
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if colorbarflag
%% Make a colorbar
fig2=figure;
left=100; bottom=100 ; width=10 ; height=500;
pos=[left bottom width height];
axis off
cbh=colorbar([0.1 0.1 0.7 0.8],...
'FontSize', 30,...
'FontWeight', 'bold');
caxis(cLim)
% title('NO2 VCD')
set(fig2,'OuterPosition',pos)
% print(fig2,'-dpng','-r150','colorbar.png')
% colorbarwithtitle('NO_2 VCD')
print(fig2,'-dpng','-r150','colorbar.png')
% kml.overlay(west, east, south, north, 'file','image.jpg')
west=max(lonlim)+0.2;
east=max(lonlim)+0.4;
north= max(latlim);
south=min(latlim);
% add colorbar to KML
cb=f.createFolder('Legend');
cb.overlay(west, east, south, north, 'file','colorbar.png')
if saveflag
k.save(OutFile);
disp(['Saved KMZ to:', char(10), OutFile])
end
if debug
k.run
end
end
end