Typical usage is to avoid statically linking a library (such as the C++ runtime library) into every executable. This saves a bit on memory usage since only a single copy of the library is loaded regardless of how many executables use it.
Another typical usage is to provide the ability to upgrade a the library without relinking the executable against the newer version. This is useful if there are bugs in the library that need to be fixed.