With the struct solution, there’s nothing to stop some other code doing new PredefinedStrings(), which won’t do anything bad, but is something it’s semantically confusing to allow. With a static class the compiler will forbid creation for you. And it goes without saying that static class is the preferred way of providing constants in the Framework.
edit to add, I said that second part without evidence – I have since searched and reasonably quickly found System.Net.Mime.DispositionTypeNames and System.Net.WebRequestMethods.Http.