OK I see, thanks, because it was a question since a while and I wondered if there was a real explanation.
Thanks for the code about it! And thanks for the explanation that this snap is not necessary if you stabilize in texel space properly.
I personally use this code to stabilize the shadow projection, 2048 is the shadow map resolution:
// Stabilize the cascade by rounding the matrix determining the fractional offset in texel space.
const Vector4 origin = m_cascadeViewProjArray[i].Transform(Vector4(0.0f, 0.0f, 0.0f, 1.0f));
const float scaledOriginX = origin.m_x * (2048.0f / 2.0f);
const float scaledOriginY = origin.m_y * (2048.0f / 2.0f);
const float roundedScaledOriginX = static_cast<float>(Math::Round(scaledOriginX));
const float roundedScaledOriginY = static_cast<float>(Math::Round(scaledOriginY));
const float roundOffsetX = roundedScaledOriginX - scaledOriginX;
const float roundOffsetY = roundedScaledOriginY - scaledOriginY;
const float scaledRoundOffsetX = roundOffsetX * (2.0f / 2048.0f);
const float scaledRoundOffsetY = roundOffsetY * (2.0f / 2048.0f);
m_cascadeProjArray[i].m_values[0][3] += scaledRoundOffsetX;
m_cascadeProjArray[i].m_values[1][3] += scaledRoundOffsetY;