A DLL is a dynamic link library. It is a collection of code and/or data, which may be used by several applications (or other libraries/modules).
So for instance common methods to process files, work with GUI components etc. are made available in libraries so several applications may use the same functionality. This not only reduces the need to build the same stuff multiple times, but it also ensures that e.g. common dialogs are the same between applications.
Libraries can be loaded at runtime and thus shared between different concurrent applications. This is called dynamic linking.
In some cases the library can be included within the application itself. This is known as static linking. Static linking makes deployment easier at the cost of flexibility as different application will each load the same copy of the DLL.
However, static linking is not always an option. E.g. you can't statically link a .NET application. The user must have the .NET libraries in order to run a .NET application and libraries (or assemblies as they are called in .NET) are loaded at runtime.
DLLs are created by the same tools used to create applications. The specific details depend very much on the tools used.