Essentially, whether a shell is login or not, interactive or not matters for exactly one reason:
The initialisation files and default options set depend on whether a shell is login or not and interactive or not.
Correspondingly, whether a shell is login or not or interactive or not depends solely on the invocation used - the exact command name and options.
The two properties are otherwise orthogonal - whether a shell is login or not has no bearing on determining whether it's interactive or not.
Bash starts a login shell if any of these are true:
argv, the name of the command it was invoked as, starts with a
-l option is specified
Similar, bash starts an interactive shell if any of these are true:
- it was not specified a file to execute (i.e., the command wasn't
bash some/file) or a command string to run (
bash -c 'foo') (the actual condition is a bit more complex, see the manual)
-i option was specified
Notably (and paradoxically), the latter implies that
bash -ic 'foo' starts an interactive shell.
So the following starts a login, interactive shell, even though it has nothing whatsoever interactive about it and the invocation had nothing to do with logging in:
bash -lic true
That logging in via console or GUI starts a login shell (or maybe not) is entirely an effect of the login process using the appropriate invocation.
The conditions and effects are described in detail in the bash manual, section on Startup Files.
A major source of confusion is that there is another common meaning for "login" shell:
A user's login shell is the shell defined in that user's
passwd entry (which may come from
/etc/passwd, LDAP or some other source).
login program, SSH, etc. start this shell as a login shell in the sense meant in the rest of the answer - with a leading
- in the command name, usually. If you wanted to be particularly confusing, you could say:
Some login processes start the login shell of the user as a login shell.
Note that GUI login starts a login shell purely because the developers thought it convenient - LightDM runs a script on login which obviously isn't interactive and certainly doesn't depend on the user's login shell (in the second sense). Do not depend on the display manager starting a login shell, though - not all of them do, and on Wayland and GNOME, the login process doesn't use shell scripts at all.