We should probably use a pin further away from SPI MOSI, as the one used right now is next to it, and MOSI can generate quite some noise. Not sure if it is indeed, as the display access and capture happen at different times, but just in case…
Besides that, both ADC1 and ADC2 have a calibration function, which I believe is called upon initialization of the ports, but I am not certain, could be good to call it at some point in the sketch.
Then we have the single PSU issue. I am using a mini clone, and your pictures show another board that probably doesn’t have a separate PSU either.
As a test before going to sleep I trimmer the last 4 bits of the samples, leaving only 8 bits of resolution, plus I should have been trimming the 4 top bits as the capture is only for 12 bits, and I wasn’t so we should do that, that may reduce that noise too.
So in my list:
-Trim top 4 bits.
-Use different pin.
-Call calibration on both ports at start.
-Trigger ADC continuous capture a bit earlier.
Now, the ADC sample time can be adjusted on the fly. Would be a good idea if you could add a command to change that, so for slower signals we get a cleaner capture.
BTW, according to specs, when using 72Mhz on the MCU main clock, the fastest ADC capture time is 1.17 uS. As we use 2 ADCs we could get double the captures, so .58 uS, which is the times you say above that you get maximum. I think we have reached the speed limit of the chip, now all we can do is improve accuracy.
Use this loop after the ADC DMA finishes to trim the top 4 bits that don’t belong to the actual sample, may make a difference. I don’t have a real oscilloscope to compare 
...
dma_disable(DMA1, DMA_CH1); //End of trasfer, disable DMA and Continuous mode.
// regs->CR2 &= ~ADC_CR2_CONT;
for (int16_t j = 0; j < maxSamples/2 ; j++ )
{
dataPoints32[j] &=0x0FFF0FFF;
}