Using SerializedObject and SerializedProperty, you’re editing the serialized data directly, not the actual object instances. Therefore you can only edit what Unity actually serializes, i.e. what is visible in the inspector.
You can have a private field and decorate it with [SerializeField] to expose in the inspector and make it accessible with SerializedProperty. Then add a public property that uses that field to use in your code.
If you want to do edit-time validation, you’re better off doing that directly in the property drawer. There’s no way to reliably check scripts in the editor, so you’ll have to repeat the checks when the script is loaded anyway (e.g. there’s no way to re-validate all scripts when you change the requirements, so existing scripts might end up with invalid values).