With both displacement and world position offset, it’s assumed that the effects of the displacement are already contained in the normalmap. This is the right choice for offline processed meshes from 3dsmax, but not for procedurally displaced things like you are doing.
What you have to do is manipulate the Normal input in the pixel shader with the same logic that you applied to the displacement or WPO. However, the normal needs to be perpendicular to your surface, while the displacement is just a delta offset. One way to solve this is to run two points through the procedural displacement, where the second point is offset along the vertex normal from the first. Then you can subtract the points after they have been displaced to get the new normal.
Doing this in the pixel shader (Normal input) is expensive so you can do it in the vertex shader with CustomizedUVs (will need to break the float3 normal into 2 float2 UVs) and then use the interpolated result in the pixel shader (Normal input).