When people say "texture", it's more so that you add high frequency details to fool the eye.
You need 1- to take a hard look at your whole pipeline and look at any place that could reduce precision. If you have multiple passes of blending, be careful if you take a 8 bit per channel data, and increase its brightness in a later pass (by multiplying by a value bigger than 1). If you have textures, make sure they don't have already banding (they are stored in sRGB format and they have enough high frequency details, especially if they are compressed textures that could have reduced their precision).
2- If you have perf to burn, make all your calculations in a higher precision (use 16 float number or 10 float number or 10 integer number rendertarget), then as a last pass convert to the 8 bit per channel format. Either with a straight conversion (if the banding was introduced by the aforementionned blending or rescaling), or with dithering.
gamma correction as well.
In what sense ? By default your desktop is displayed (implicitly) in sRGB format (based on your monitor default assumption). That format increases the precision in the dark areas which is where most banding is visible. So the recommendation would be to NOT touch the default color correction/color space. Changing the monitor/scanout color space to a "linear" format (with SetGammaRamp() for example) will definitely increase banding (linear is still recommended for lighting computations which is where the hw capability (or the shader based conversion) comes in). If you have to make brightness adjustments, try to do it shader based as much as possible rather than playing on the output ramp.