The short answer is that each browser implements the industry standards based on the implementation team's understanding of those standards.
There are several different base engines that are used by different browsers, including but not limited to WebKit, Gecko, Trident, and Blink. That accounts for the majority of differences in behavior between different browsers in my experience.
In addition, each browser implements the engine in a different way, depending on the operating systems the browser supports, the range of devices the browser supports, the focus of the programming team, and many other factors.
Since most of the major rendering engines are written in C++, they have to be recompiled for different operating systems - which introduces another layer of potential differences, because each compiler optimizes and generates binaries in a slightly different way - and that's assuming the authors of the original code did not include any operating-system-specific code (which is a rather large assumption to make in my experience). The end result is that the same version of the same browser will behave differently in different operating systems (Firefox in Windows as opposed to Firefox in Linux systems is a good example here).
One example that I know (because I've experienced it) is something as simple as when the OnChange() event for a dropdown fires: Firefox, Chrome, and Safari fire the event after the dropdown loses focus. Internet Explorer (all versions so far) fire the event each time the selected item changes. If your web application enables/disables or shows/hides fields based on the selection in a dropdown, exactly when those fields are enabled will vary depending on the browser - which in turn can cause other differences in behavior.