Define ColorFunction that constrains $0$ to be gray and uses full range on positive or negative values
ClearAll[myBlend]
myBlend[minmax_: {0, 1}, colors_: {Red, Gray, Green}] :=
Blend[Thread[{{-Max@Abs@minmax, 0, Max@Abs@minmax}, colors}], #] &
Examples:
SeedRandom[1]
array1 = RandomReal[{-.5, 1}, {11, 11}];
array2 = -array1;
Row[ListDensityPlot[#, InterpolationOrder -> 0, ImageSize -> 400,
ColorFunction -> myBlend[MinMax@#], ColorFunctionScaling -> False,
PlotLabel -> Row[{"minmax : ", MinMax@#}]] & /@ {array1, array2}]