You can escape the % character:
[DisplayFormat(DataFormatString = @"{0:#\%}")]
Note that there are two ways to use \ as an escape character: if you prefix a string literal with the verbatim symbol (@), then \ characters are included in the string as-is, which means that as part of a format string a single \ will function as an escape character.
Without the @ verbatim symbol, \s are interpreted as escape strings by the compiler and as such need to be escaped themselves, as \\.
Pick one or the other, but not both:
@"{0:#\%}" -> right
"{0:#\\%}" -> right
@"{0:#\\%}" -> wrong