tr only changes single characters to other single characters (or deletes them), and it has no sense of the context of any character. It can't therefore distinguish between a character at the beginning, middle, or end of a word. It does not even know what a "word" is.
Changing a text to title case (what you call "proper case") or to sentence case is impossible using tr.
You need a tool that you can use to give some context to the individual character with.
This is a naive GNU sed program that converts a text to title case by matching separate words and changing their first character:
$ sed 's/\<\([[:lower:]]\)\([[:alnum:]]*\)/\u\1\2/g' file There Is No Danger On The Roof. There Is No Cow On The Ice. The \< matches at transition point between a non-word character and a word character (i.e., at the start of a word). The rest of the regular expression matches a lower case letter followed by any number of alphanumeric characters. If it matches, it changes the lower case letter to an upper case letter and appends the rest of the word. The upper-casing of the first letter is using a GNU sed extension (this would not work most other sed implementations).
For sentence casing a text, another naive GNU sed variation:
$ sed 's/\<\([[:lower:]]\)\([^[:punct:]]*\)/\u\1\2/g' file There is no danger on the roof. There is no cow on the ice. This is more or less the same thing again, but instead of matching across a word of alphanumerical characters, we match across a string of characters that are not punctuation characters.
Note that this only works on really simple texts of the type that you show in the question. The second sed, would, for example, not properly cope with the question what's that?, due to ' being a punctuation character matched by [[:punct:]].