How can I know when to use a public property or a private property?
As a general rule, and value contained in a property that may change during installation should be created in all uppercase as a public property.
The following is from the SDK:
The only way a user can interact with private properties is through Control Events in the package's authored user interface. Private property names must include lowercase letters. Private property values cannot be overridden at a command line.
The values of public properties can be changed by a user or system administrator by setting the property on the command line, by applying a transform, or by interacting with an authored user interface. Public property names cannot contain lowercase letters. Public properties are commonly set by users during the installation.