I too had the question #2: "what difference between MinGW-w64 Win32 Shell and MSYS2 Shell?". I found the answer to it on this official wiki page. For the original complete formatting, please see the original page. Here is the relevant part of the page, as of 9th August of 2017.
MSYS2 susbsystems
MSYS2 consists of three subsystems and their corresponding package
repositories, msys2, mingw32, and mingw64.
The mingw subsystems provide native Windows programs and are the main
focus of the project. These programs are built to co-operate well with
other Windows programs, independently of the other subsystems.
The msys2 subsystem provides an emulated mostly-POSIX-compliant
environment for building software, package management, and shell
scripting. These programs live in a virtual single-root filesystem
(the root is the MSYS2 installation directory). Some effort is made to
have the programs work well with native Windows programs, but it's not
seamless.
Each of the subsystems provides its own native (i.e. target=host)
compiler toolchain, in msys2-devel, mingw-w64-i686-toolchain, and
mingw-w64-x86_64-toolchain. There are also cross compiler toolchains
with host={i686,x86_64}-pc-msys and target={i686,x86_64}-w64-mingw32
in mingw-w64-cross-toolchain, but these are of limited use because
there are no library packages for them.
Shells
Every subsystem has an associated "shell", which is essentially a set
of environment variables that allow the subsystems to co-operate
properly. These shells can be invoked using launchers in the MSYS2
installation directory or using the shortcuts in the Windows Start
menu. The launchers set the MSYSTEM variable and open a terminal
window (mintty) with a proper shell (bash). Bash in turn sources
/etc/profile which sets the environment depending on the value of
MSYSTEM. Without the correct environment, various things may and will
(sometimes silently) break. The exception is using mingw subsystems
from pure Windows, which shouldn't require any special environment
apart from an entry in PATH. Do not set MSYSTEM outside of the shells,
because that will also break things.