Because if it is a public property, then you can change the internals of your class without affecting the outside world.
For example, if you have a class with a public variable "username" which holds data like "Mr Paul Jones" and "Mrs Alison Mary Smith", it works fine.
Until you realise that your class would work better if you used four name parts instead:
Status title;
string firstName;
string middleNames;
string lastName;
What happens to the outside world? Every class that used yours relies on "username": but it doesn't exist!
If username is a property, you can provide a getter and a setter that makes it work with the internal form, but looks just like the external form to legacy classes - nothing outside needs to change, you just have to test your revised class.