Dynamic modules are modules that can be configured when imported — instead of a static @Module({...}), they expose static methods (conventionally forRoot and forFeature) that return a module configured with the arguments you pass. This is how configurable, reusable modules (config, database, JWT) accept options.
