With help from rm-rf, I was able to figure this out. The key lies in setting the ImagePadding the same for each plot, then combining them with Grid.
(Does anyone use GraphicsGrid? It seems like a trainwreck to me, with wild amounts of spacings that you can get rid of by manually tweaking them, but they crop right back up when you try to scale the image to a larger size).
So with the data defined as
xrange={8,19}; yrange={6,16}; twoDlist=Table[Abs[I/(\[Omega]1-14+I) I/(\[Omega]2-11+I)+(I/3)/(\[Omega]1-8+I/3) I/(\[Omega]2-16+I)],{\[Omega]1,yrange[[1]],yrange[[2]],.05},{\[Omega]2,xrange[[1]],xrange[[2]],.05}]; and the function defined as
getMaxPadding[p_List] := Map[Max, (BorderDimensions@ Image[Show[#, LabelStyle -> White, Background -> White]] & /@ p)~Flatten~{{2}, {3}}, {2}] + 1; combinedplot[data_, xrange_, yrange_, plotopts : OptionsPattern[]] := Module[{rightdata, topdata, dy, contourplot, rightplot, topplot, padding, dimensions}, rightdata = Total /@ data; topdata = Total[data]; dy = (yrange[[2]] - yrange[[1]])/(Length[rightdata] - 1.0); rightdata = Transpose[{rightdata, Table[n, {n, yrange[[1]], yrange[[2]], dy}]}]; contourplot = ListContourPlot[data, DataRange -> {xrange, yrange}, ContourShading -> None, Contours -> 30, PlotRange -> {xrange, yrange, All}, ContourStyle -> Table[{Thick, Blend[{Blue, Green, Yellow, Red}, n]}, {n, 1/30, 1, 1/30}], Evaluate[FilterRules[{plotopts}, Options[ListContourPlot]]], PlotRangePadding -> 0(*,ImageSize->300*)]; padding = getMaxPadding[{contourplot}]; dimensions = ImageDimensions[contourplot]; rightplot = ListLinePlot[rightdata, PlotStyle -> {{Red, Thickness[.04]}}, Axes -> False, PlotRange -> All, ImageSize -> {Automatic, dimensions[[2]]}, ImagePadding -> {{0, 5}, padding[[2]]}, PlotRangePadding -> 0, AspectRatio -> 5]; topplot = ListLinePlot[topdata, PlotRange -> All, DataRange -> xrange, Axes -> False, PlotStyle -> {{Thickness[.008], Red}}, ImageSize -> {dimensions[[1]], Automatic}, AspectRatio -> 1/5, PlotRangePadding -> 0, ImagePadding -> {padding[[1]], {0, 10}}]; Grid[{{topplot, Null}, {contourplot, rightplot}}, Alignment -> Bottom]]; The result is robust to changing the size of the image, or any other options for ListContourPlot. The following input
Grid[{{ combinedplot[twoDlist, xrange, yrange, ImageSize -> 250], combinedplot[twoDlist, xrange, yrange, ImageSize -> 561, BaseStyle -> 30], combinedplot[twoDlist, xrange, yrange, ImageSize -> 561, BaseStyle -> 30, FrameLabel -> {Style[ "\!\(\*SubscriptBox[\(\[CapitalOmega]\), \(1\)]\)", 30], Style["\!\(\*SubscriptBox[\(\[CapitalOmega]\), \(3\)]\)", 30]}, FrameStyle -> Thick] }}] gives this as output. 