I dug into the 13.1.0 assemblies: this isn't a config issue on your side, it's that Preview and Visual Builder are two separate editing surfaces resolving the caption through two separate metadata pipelines. Classic Preview is the legacy epi-cms (Dojo) on-page-editing overlay, which only gets data-epi-property-name (the raw code name) from the markup and prints property.metadata.displayName, resolved server-side as localization, then EditCaption (your [Display(Name)]), then a fall-back to the property name; Visual Builder is the newer React ContentManager pipeline that never reads that attribute, so it shows the translated label. If the caption comes from a localization provider or XML, the likely cause is CMS-51841 (providers were not applied to property captions in 13.0.x, fixed in 13.1.0), so test on 13.1.0+ first; if a plain [Display(Name)] with no XML still shows the code name there, it is a residual overlay bug worth a support ticket.
Visual Builder pane picks up the correct translated label but in Preview pane hover something shows the "system" name, am I missing something or is this a known flaw?