The purpose is backward and forward compatibility respectively.
The minimum version is the easiest to explain: any older, and your app just won't run. Don't even try. I (app) don't have the compatibility code to work with you if you are older than my minimum version because I didn't choose to include it, and you (Android) don't know the changes that were made in the future platform versions, so you can't help me.
Target version is a little more complex. This is the version of the API that I am designed to run with. You can use this information to set compatibility parameters for forward compatibility. For example, if I try to use API that doesn't exist in your version or that would have had different behavior, you would know what I'm expecting because I declared to you what it was designed for at the time. This allows the system to tolerate your outdatedness better.
However, that compatibility feature sometimes leads to security issues because the new API tends to be more restricted or improved in ways that enhance security and privacy, hence the argument why there should be a minimum target version to express that you cannot use the less secure API even for the sake of compatibility.