.NET has two types of properties, a normal .NET property and a dependency property. The latter has extra functionality that a normal .NET property does not have.
The most notable is that a dependency property can use an ActivityBind to determine its value dynamically at runtime. This means that you can use the Bind to Activity property to set its value. That is better than having to resort to code to initialize the properties. This is of particular interest when developing activities.
Another use of dependency properties is creating metadata properties. These metadata properties cannot be changed at runtime so, using these, you can protect your workflow from altering certain properties (read behavior) at runtime.