This isn't correct for a world-space normal:
output.Normal = mul(input.Normal, (float3x3) World);
As long as you have no skew or scale in your World matrix, it will “work,” but as soon as you have skew or scale, you will want to use the inverse of the transpose of the upper-left three-by-three of the World matrix, to properly get flattening on squash and such. Otherwise the scale scales “in the wrong direction.”
float3 WorldLightDir = mul(LightDir.xyz, (float3x3) World);
Is your light really expressed in object coordinates? I would expect, because you do lighting in world space, that the light direction will already be in world space.
And even if you DO use object-local coordinates, you should not need to transform this for every pixel shader invocation, given that LightDir seems to be a constant. But very likely, you should just take out this transformation – or multiply it by some light-specific transform matrix. (Typically, this is done in software, before the shader is configured, if you have a light entity with a world transform.)
float3 WorldNormal = mul(input.Normal, (float3x3) World);
You already transformed the normal into world space, before interpolation. Re-transforming it will generate hard-to-predict outcomes.